AWS IAMのパスワードポリシーをAWS CLIから操作する
はじめに
AWS IAMにはユーザーアカウントのパスワードをセキュアに管理するためにパスワードの複雑性や有効期限などを細かく制御するパスワードポリシーの機能が備わっています。
今回は、このパスワードポリシーをCLIから操作する方法を紹介します。
パスワードポリシーはAWSアカウントごとに設定するため、複数のAWSアカウントのパスワードポリシーをまとめて設定するようなケースでは、マネジメントコンソール経由よりは、SDK/CLI経由のほうが利便性が高いです。
AWS IAM のパスワードポリシーについて
AWS IAM パスワードポリシーの一般論については過去の次のブログを参照下さい。
ポリシーには大きく分けて、以下が存在します。
- パスワードの複雑さ
- パスワードの長さパスワードに利用可能な文字の種類(大文字・小文字・英数字・記号)などが該当します
- パスワードの有効期限
- パスワードの有効期間や再利用可能性などが該当します。
- パスワード変更権限
- ユーザー自身がパスワードを変更出来るのか、などが該当します。
マネジメントコンソールでは、IAM → アカウント設定 と遷移すると、 パスワードポリシーの画面に移動します。
実際の画面は次のようになっています。
マネジメントコンソールからは、チェックボックスを変更して「パスワードポリシーの適用」をクリックするだけで、特に悩む箇所はないかと思います。
IAM パスワードポリシーのAPIについて
このパスワードポリシーを操作する API は IAM サービス配下に以下の3種類が存在します。
- 取得
- 作成または変更
- 削除
これら API について順に解説します。
ポリシーとAPIパラメーターの対応
まずは各ポリシーについて、マネジメントコンソールでの表記とAPIでのパラメーターを整理します
マネジメントコンソール(日本語) | マネジメントコンソール(英語) | APIパラメーター | デフォルト値 | 備考 |
パスワードの最小長 | Minimum password length | MinimumPasswordLength | 6 | 6から128まで指定可能 |
少なくとも 1 つの大文字が必要 | Require at least one uppercase letter | RequireUppercaseCharacters | false | |
少なくとも 1 つの小文字が必要 | Require at least one lowercase letter | RequireLowercaseCharacters | false | |
少なくとも 1 つの数字が必要 | Require at least one number | RequireNumbers | false | |
少なくとも 1 つの英数字以外の文字が必要 | Require at least one nonalphanumeric character | RequireSymbols | false | 記号は「! @ # $ % ^ & * ( ) _ + - = [ ] { } | '」の中から利用可能 |
ユーザーにパスワードの変更を許可 | Allow users to change their own password | AllowUsersToChangePassword | false | |
パスワードの失効を許可 | Enable password expiration | N/A | N/A | |
パスワードの有効期間(日数) | Password expiration period (in days) | MaxPasswordAge | 0 | デフォルトの「0」の場合はパスワードは無効にならない。1から1095の間の数字外指定されると、指定日数後にパスワードが無効になる。 |
パスワードの再利用を禁止 | Prevent password reuse | N/A | N/A | |
記憶するパスワードの数 | Number of passwords to remember | PasswordReusePrevention | 0 | 1から24の間の数字が指定された場合のみ機能する |
パスワードの有効期限で管理者のリセットが必要 | Password expiration requires administrator reset | HardExpiry | false |
パスワードポリシーの設定
パスワードポリシーは一括更新だけに対応し、ポリシーの一部だけを変更することはできません。 指定しなかったポリシーはデフォルト値に戻ります。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html
使ってみる
パラメーター全部盛りでパスワードポリシーを作成してみます。 各パラメーターはオプショナルのため、抜き差し可能です。
$ aws iam update-account-password-policy \ --minimum-password-length 6 \ --require-symbols \ --require-numbers \ --require-uppercase-characters \ --require-lowercase-characters \ --allow-users-to-change-password \ --max-password-age 1000 \ --password-reuse-prevention 3 \ --hard-expiry $ aws iam get-account-password-policy { "PasswordPolicy": { "AllowUsersToChangePassword": true, "RequireLowercaseCharacters": true, "RequireUppercaseCharacters": true, "MinimumPasswordLength": 6, "RequireNumbers": true, "PasswordReusePrevention": 3, "HardExpiry": true, "RequireSymbols": true, "MaxPasswordAge": 1000, "ExpirePasswords": true } }
使ってみる(デフォルト値)
この update API は部分更新はできず、指定しなかった値はデフォルト値に戻る仕様です。
This action does not support partial updates. No parameters are required, but if you do not specify a parameter, that parameter's value reverts to its default value. http://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html
実際に動作を確認してみましょう。
ユーザーにパスワードの変更を許可するポリシー(--allow-users-to-change-password)だけ渡します。
$ aws iam update-account-password-policy --allow-users-to-change-password $ aws iam get-account-password-policy { "PasswordPolicy": { "AllowUsersToChangePassword": true, "RequireLowercaseCharacters": false, "RequireUppercaseCharacters": false, "MinimumPasswordLength": 6, "RequireNumbers": false, "RequireSymbols": false, "ExpirePasswords": false } }
パラメーターで指定しなかったもろもろのポリシーがデフォルトに戻り、例えばパスワードの最小長(MinimumPasswordLength)は6に変更されているのがわかります。
使ってみる(CLIのskeleton機能)
AWS CLIにはAPIをJSON形式で渡す機能があります。
リクエスト時に利用するJSONを生成する --generate-cli-skeleton
と、リクエスト時にJSONデータを渡す --cli-input-json
で構成されます。ポリシーをJSONファイルでソースコード管理しておくと、差分を簡単に終えます。
この機能でパスワードポリシーを変更してみましょう。
まずはJSONのスケルトンを生成します。
$ aws iam update-account-password-policy --generate-cli-skeleton | tee policy.json { "MinimumPasswordLength": 0, "RequireSymbols": true, "RequireNumbers": true, "RequireUppercaseCharacters": true, "RequireLowercaseCharacters": true, "AllowUsersToChangePassword": true, "MaxPasswordAge": 0, "PasswordReusePrevention": 0, "HardExpiry": true }
このJSONファイルを修正して実際に更新します。
$ cat policy.json { "MinimumPasswordLength": 16, "AllowUsersToChangePassword": true, "MaxPasswordAge": 1000, "PasswordReusePrevention": 3 } $ aws iam update-account-password-policy --cli-input-json file://policy.json $ aws iam get-account-password-policy { "PasswordPolicy": { "AllowUsersToChangePassword": true, "RequireLowercaseCharacters": false, "RequireUppercaseCharacters": false, "MinimumPasswordLength": 16, "RequireNumbers": false, "PasswordReusePrevention": 3, "RequireSymbols": false, "MaxPasswordAge": 1000, "ExpirePasswords": true } }
無事変更できました。
パスワードポリシーを取得
AWS アカウントのパスワードポリシーを取得します。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html
使ってみる
パラメーターなしに API を呼び出すだけです。
パスワードポリシーが設定されていない状態でこの API を叩くと 404:NoSuchEntity
エラーが発生します。
デフォルトではパスワードポリシーは設定されていないので注意しましょう。
$ aws iam get-account-password-policy An error occurred (NoSuchEntity) when calling the GetAccountPasswordPolicy operation: The Password Policy with domain name 123456789012 cannot be found.
また、パスワードポリシー内容によって、レスポンスエレメントが変わります。
たとえば、パスワード最小長とユーザー自身によるパスワード変更を許可したシンプルなポリシーのレスポンスが以下です。
$ aws iam get-account-password-policy { "PasswordPolicy": { "AllowUsersToChangePassword": true, "RequireLowercaseCharacters": false, "RequireUppercaseCharacters": false, "MinimumPasswordLength": 8, "RequireNumbers": false, "RequireSymbols": false, "ExpirePasswords": false } }
パスワードポリシーでパスワードの有効期限や再利用も設定すると、レスポンスエレメントが増えます。
$ aws iam get-account-password-policy { "PasswordPolicy": { "AllowUsersToChangePassword": true, "RequireLowercaseCharacters": false, "RequireUppercaseCharacters": false, "MinimumPasswordLength": 8, "RequireNumbers": false, "PasswordReusePrevention": 3, // 記憶するパスワードの数: "HardExpiry": true, // パスワードの有効期限で管理者のリセットが必要 "RequireSymbols": false, "MaxPasswordAge": 1000, // パスワードの有効期間(日数) "ExpirePasswords": true // パスワードの失効を許可 } }
削除
AWS アカウントのパスワードポリシーを取得します。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html
使ってみる
パラメーターなしに API を呼び出すだけです。
$ aws iam delete-account-password-policy $ aws iam get-account-password-policy An error occurred (NoSuchEntity) when calling the GetAccountPasswordPolicy operation: The Password Policy with domain name 205974338614 cannot be found.
パスワードポリシーが設定されていない場合は、404:NoSuchEntity
エラーが発生します。
$ aws iam delete-account-password-policy An error occurred (NoSuchEntity) when calling the DeleteAccountPasswordPolicy operation: The account policy with name PasswordPolicy cannot be found.
既存パスワードへの影響
パスワードポリシーを変更すると、設定済みのパスワードはどのように影響を受けるのでしょうか?ドキュメントから引用します。
パスワードポリシーを作成または変更する場合、パスワードポリシーの設定の多くは、ユーザーが次回パスワードを変更するときに適用されます。ただし、一部の設定はすぐに適用されます。以下に例を示します。
・最小長と文字タイプの要件を設定すると、その設定はユーザーが次回パスワードを変更するときに適用されます。既存のパスワードが更新されたパスワードポリシーに従っていない場合でも、ユーザーは既存のパスワードの変更を強制されません。
・パスワードの有効期限を設定した場合、有効期限は直ちに適用されます。たとえば、パスワードの有効期限を 90 日に設定した場合、90 日以上前に設定したパスワードを現在使用しているすべての IAM ユーザーは、次回サインインするときにパスワードの変更を強制されます。
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html
まとめ
AWS アカウントをセキュアに運用する上で非常に重要なIAMパスワードポリシーのCLIからの操作方法について紹介しました。
管理するAWSアカウント数が増えてくると、各AWSアカウントのマネジメントコンソールにログインして操作するのは非常に手間です。 SDK/CLI経由での操作手順も覚えておくと生産性が上がります。
なお、利用者のリテラシーによって、パスワードポリシーの複雑さは良い方向にも・悪い方向にも機能することが様々な研究で報告されています。ポリシーを策定する前に、たとえば次のペーパーを一読することをお勧めします。
Password Guidance - Microsoft Research